import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import java.util.List;
/**
 * Escribe una descrición de la clase Chapulin aquí.
 * 
 * @autor Andrés Cruz Santiago
 * @versión 22/10/13
 */
public class Chapulin extends Actor
{
    private int tam;//Tamano del Chapulín Colorado
    private SimpleTimer timer;//Velocidad al Presionar una Tecla
    private SimpleTimer t2;//Velocidad del Cambio de Imagen
    private int vidas;//Número de Vidas del Chapuliín Colorado
    private int salta;
    private boolean chiActivado; //Chiquitolina Activada
    private int porcentaje; //Porcentaje de Vida
    private boolean chicharraActivada; // Bandera Chicharra Activadad
    private boolean chipoteActivado; //Bandera Chipote Activado
    private int puntos; //Puntos Ganados
    private UserInfo information; 
    private Direccion dir;

    /**
     * Constructor de Chapulín
     * @param unTamano Tamano del Chapulín
     * @param numVidas Número de Vidas
     */
    public Chapulin(int numVidas, int puntosGanados)
    {
        vidas=numVidas;
        timer = new SimpleTimer();
        t2 = new SimpleTimer();
        timer.mark();
        t2.mark();
        salta=0;
        chiActivado=false;
        porcentaje=100;
        chicharraActivada=false;
        chipoteActivado=false;
        puntos=puntosGanados;
        dir=Direccion.IZQ;
    }

    /**
     *Constructor de Chapulín 
     */
    public Chapulin()
    {
        this(3,0);
    }

    /**
     * Act - do whatever the Chapulín wants to do. This method is called whenever
     * the 'Act' or 'Run' button gets pressed in the environment.
     */
    public void act() 
    {
        if(timer.millisElapsed() > 100)
        {
            timer.mark(); 

            if(dir == Direccion.IZQ)
            {
                if(chiActivado)
                    this.setImage("chi02.png");  
                else
                    this.setImage("cha02.png");  
            }
            else
            if(dir == Direccion.DER)
            {
                if(chiActivado)
                    this.setImage("chi01.png");  
                else
                    this.setImage("cha01.png");
            }

            if(tocaCentroEscalera())
            {
                if(Greenfoot.isKeyDown("up"))
                    this.setLocation(this.getX(),this.getY()-10);
                if(Greenfoot.isKeyDown("down") && !hayPiso())
                    this.setLocation(this.getX(),this.getY()+10);
            }
            if(Greenfoot.isKeyDown("left"))
            {
                if(chiActivado)
                    this.setImage("chi02.png");  
                else
                    this.setImage("cha02.png");
                this.setLocation(this.getX()-10,this.getY());
                dir=Direccion.IZQ;
            }
            if(Greenfoot.isKeyDown("right"))
            {
                if(chiActivado)
                    this.setImage("chi01.png");  
                else
                    this.setImage("cha01.png");
                this.setLocation(this.getX()+10,this.getY());
                dir=Direccion.DER;
            }
            if(Greenfoot.isKeyDown("c"))
            {
                chiActivado=!chiActivado;
                Greenfoot.playSound("pastilla.wav");
                this.setLocation(getX(),getY()-50);    
            }
            if(Greenfoot.isKeyDown(" ") && salta==0 && hayPiso())   
            {
                salta++;        
                Greenfoot.playSound("jump.wav");
            }
            if(Greenfoot.isKeyDown("z") && chipoteActivado)
            {
                if(dir == Direccion.IZQ)
                {
                    if(chiActivado)
                        this.setImage("chi03.png");  
                    else
                        this.setImage("cha03.png");
                }
                else
                {
                    if(chiActivado)
                        this.setImage("chi04.png");  
                    else
                        this.setImage("cha04.png");
                }
            }

            if(Greenfoot.isKeyDown("z") && chipoteActivado && isTouching(Pirata.class))
            {
                Greenfoot.playSound("chipote.wav");
                if(dir == Direccion.IZQ)
                {
                    if(chiActivado)
                        this.setImage("chi05.png");  
                    else
                        this.setImage("cha05.png");
                }
                else
                {
                    if(chiActivado)
                        this.setImage("chi06.png");  
                    else
                        this.setImage("cha06.png");
                }
                Actor nuevo= this.getOneIntersectingObject(Pirata.class);
                if(nuevo!=null)
                {
                    if(nuevo instanceof Secuestrador)
                    {
                        ((Pirata)nuevo).decrementaPorcentaje(5);
                        setPuntos(10);

                        Escenario escenario = (Escenario)getWorld();    
                        Counter points = escenario.getPuntos();
                        points.setValue(puntos);
                    }
                    else
                    {
                        ((Pirata)nuevo).decrementaPorcentaje();
                        setPuntos(10);

                        Escenario escenario = (Escenario)getWorld();    
                        Counter points = escenario.getPuntos();
                        points.setValue(puntos);
                    }
                    if(((Pirata)nuevo).getPorcentaje() == 0)
                    {
                        World mundo= this.getWorld();

                        mundo.removeObject(nuevo);
                        setPuntos(100);

                        Escenario escenario = (Escenario)getWorld();    
                        Counter points = escenario.getPuntos();
                        points.setValue(puntos);
                    }
                }
            }
            if(Greenfoot.isKeyDown("x") && chicharraActivada)
            {        
                Greenfoot.playSound("chicharra.wav");
                List lista= this.getNeighbours(500, false, Actor.class);
                if(!lista.isEmpty())
                {
                    for(int i=0;i<lista.size();i++)
                    {
                        if(((Actor)(lista.get(i))).getY() < (this.getImage().getHeight() + this.getY())  && ((Actor)(lista.get(i))).getY()> ( this.getY() - this.getImage().getHeight()) )
                        {
                            if(((Actor)(lista.get(i))) instanceof Pirata)
                                ((Pirata)((Actor)(lista.get(i)))).desactivaActua();
                            else
                            if(((Actor)(lista.get(i))) instanceof Bomba)
                                ((Bomba)((Actor)(lista.get(i)))).desactivaActua();
                            else
                            if(((Actor)(lista.get(i))) instanceof Espada)
                                ((Espada)((Actor)(lista.get(i)))).desactivaActua();
                        }
                    }
                }
            }
        } 

        if(this.getVidas() <= 0)
        {
            Aviso aviso = new Aviso("You LOST");
             Greenfoot.playSound("lost.wav");
            this.getWorld().addObject(aviso, 300, 300);
            Greenfoot.delay(40);
            Greenfoot.setWorld(new Menu());

        } 

        nivelUp(); 
        salta();
        if(salta==10)
            salta=0;

        hayPiso();

        if(!hayPiso() && salta < 1 && !tocaCentroEscalera())
            this.setLocation(getX(),getY()+5); //GRAVEDAD
    }    

    /**
     *Retorna a una posición específica al Chapulín en el Escenario 
     */
    public void goHome()
    {
        this.setLocation(579,574);
    }

    /**
     * Decrementa una Vida del Chapulín
     */
    public void decrementaVidas()
    {
        vidas--;
    }

    /**
     * Retorna el porcentje de Vida Actual
     */
    public int getPorcentaje()
    {
        return porcentaje;
    }

    /**
     * Decrementa 20% del Vida
     */
    public void decrementaPorcentaje()
    {
        porcentaje-=20;
    }

    /**
     * Asigna un Porcentaje de Vida 
     * @param unPorcentaje Porcentaje de Vida
     */
    public void setPorcentaje(int unPorcentaje)
    {
        porcentaje=unPorcentaje;
    }

    /**
     * Regresa el Número de Vida(s) Actuale(s) del Chapulín
     * @return Número de Vida(s) del Chapulín
     */
    public int getVidas()
    {
        return vidas;
    }

    /**
     * Asigna un Número de Vidas al Chapulín
     * @param numeroVidas Número de Vidas
     */
    public void setVidas(int numeroVidas)
    {
        vidas=numeroVidas;
    }

    /**
     * Simula el Salto del Chapulín
     */
    public void salta()
    {        
        if(salta!=0)
        {
            this.setLocation(this.getX(),this.getY()-10);
            if(Greenfoot.isKeyDown("right"))
                this.setLocation(this.getX()+10,this.getY());
            if(Greenfoot.isKeyDown("left"))
                this.setLocation(this.getX()-10,this.getY());
            salta+=1;
        }
    }

    /**
     * Pasa a un Nivel Superior
     */
    public void nivelUp()
    {
        Actor nuevo= this.getOneIntersectingObject(Puerta.class);
        if(nuevo!=null)
        {
            int nivel = ((Puerta)nuevo).getNumero();
            if(nivel == 1)
            {
                Greenfoot.delay(40);
                Aviso aviso = new Aviso("Nivel 2 ");
                this.getWorld().addObject(aviso, 300, 300);
                Greenfoot.delay(40);
                Greenfoot.setWorld(new Nivel2(getVidas(),getPuntos()));
            }
            else
            if(nivel == 2)
            {
                Greenfoot.delay(40);
                Aviso aviso = new Aviso("Nivel 3 ");
                this.getWorld().addObject(aviso, 300, 300);
                Greenfoot.delay(40);
                Greenfoot.setWorld(new Nivel3(getVidas(),getPuntos()));
            }
        }  
        if(isTouching(Princesa.class))
        {
            Greenfoot.playSound("win.wav");
            Aviso aviso = new Aviso("You Win");
            this.getWorld().addObject(aviso, 300, 300);
            if(UserInfo.isStorageAvailable())
            {
                information = UserInfo.getMyInfo();
                if(information!=null)
                {
                    if(puntos > information.getScore())
                    {
                        information.setScore(puntos);
                        information.store();
                    }
                }
            }
            Greenfoot.delay(40);
            Greenfoot.setWorld(new Menu());
        }
    }

    /**
     * Verifica si el Chapulín esta sobre el Piso
     * @return true si está sobre el Piso
     * @return false si no está sobre el Piso
     */
    public boolean hayPiso()
    {
        int rango=((this.getImage().getHeight())/2);

        Actor aux1=getOneObjectAtOffset(0,rango,Piso.class);

        if(aux1!=null)
            return true;
        else 
            return false;
    }

    /**
     * Verifica si el Chapulín está justo en frente de la Escalera
     * @return true Si está frente de la escalera
     */
    public boolean tocaCentroEscalera()
    {            
        Actor aux1=getOneObjectAtOffset(0,0,Escalera.class);

        if(aux1!=null)  
            return true;
        else
            return false;
    }

    /**
     * Activa Chipote Chillón
     */
    public void activaChipote()
    {
        chipoteActivado=true;
    }

    /**
     * Activa Chicharra Paralizadora
     */
    public void activaChicharra()
    {
        chicharraActivada=true;
    }

    /**
     * Suma Puntos Ganados al Chapulin
     * @param Puntos Ganados
     */
    public void setPuntos(int puntosGanados)
    {
        puntos+=puntosGanados;
    }

    /**
     * Regresa los Puntos Actuales del Chapulín
     * @return Puntos Actuales del Chapulin
     */
    public int getPuntos()
    {
        return puntos;
    }
}